package cn.sc.hunter.framework.helper;

import cn.sc.hunter.framework.annotation.Inject;
import cn.sc.hunter.framework.util.ArrayUtil;
import cn.sc.hunter.framework.util.CollectionUtil;
import cn.sc.hunter.framework.util.ReflectionUtil;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Map;

/**
 * 依赖注入助手类
 *
 * @author hunter.chen
 * @version 1.0
 * @since ${date}
 */
public final class DependencyInjectHelper {
    static {
        // 获取 Bean 类与 Bean 实体映射Map
        Map<Class<?>, Object> beans = BeanHelper.getBeanMap();
        if (CollectionUtil.isNotEmpty(beans)) {
            // 循环遍历 Bean Map
            beans.entrySet().forEach(entry -> {
                // 从 beans 中获取 Bean 类和实例
                Class<?> clazz = entry.getKey();
                Object instance = entry.getValue();
                // 获取 Bean 类所有的成员变量
                Field[] fields = clazz.getDeclaredFields();
                if (ArrayUtil.isNotEmpty(fields)) {
                    // 循环遍历 fields
                    Arrays.asList(fields).stream().forEach(item -> {
                        // 判断当前 Bean 的 item 是否有 Inject 注解
                        if (item.isAnnotationPresent(Inject.class)) {
                            // 在 Bean Map 中获取 item 对应的实例
                            Class<?> itemClass = item.getType();
                            Object itemInstance = beans.get(itemClass);
                            if (itemInstance != null) {
                                // 通过反射初始化 BeanField 的值
                                ReflectionUtil.setField(instance, item, itemInstance);
                            }
                        }
                    });
                }
            });
        }
    }
}
